package com.example.shengsheng;

import android.os.Bundle;
import android.os.StrictMode;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.example.shengsheng.entity.Api;
import com.example.shengsheng.entity.Student;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
    }

    public void onClick1(android.view.View view) {
        System.setProperty("http.proxyHost", "192.168.2.102");
        System.setProperty("http.proxyPort", "18888");

        //1.创建OkHttpClient对象
        OkHttpClient okHttpClient = new OkHttpClient();
        //2.创建Request对象，设置一个url地址（百度地址）,设置请求方式。
        Request request = new Request.Builder().url("http://sd.jumpcity.cm/api/v1.test/aa").method("GET",null).build();
        //3.创建一个call对象,参数就是Request请求对象
        Call call = okHttpClient.newCall(request);
        try {
            Log.d("haha box", "onResponse 11");
            //同步调用,返回Response,会抛出IO异常
            Response response = call.execute();
            String responseData = response.body().string();
            Log.d("haha box", responseData);

            // 使用 fastjson

            // 成功，php 返回的 data 的值是一个字符串；
//            Api api = JSON.parseObject(responseData, new TypeReference<Api<String>>(){});
//            Log.d("haha errcode", api.getErrcode() + "");
//            Log.d("haha message", api.getMessage());
//            Log.d("haha data", (String) api.getData());

            // 成功，php 返回的 data 的值是一个数字；
//            Api api = JSON.parseObject(responseData, new TypeReference<Api<Integer>>(){});
//            Log.d("haha errcode", api.getErrcode() + "");
//            Log.d("haha message", api.getMessage());
//            Log.d("haha data", "" + (Integer) api.getData());

            // 成功，php 返回的 data 的值是一个一维的关联数组，被映射为 java 的一个对象；
//            Api api = JSON.parseObject(responseData, new TypeReference<Api<Student>>(){});
//            Log.d("haha errcode", api.getErrcode() + "");
//            Log.d("haha message", api.getMessage());
//            Student student = (Student) api.getData();
//            Log.d("haha id", student.getId() + "");
//            Log.d("haha name", student.getName());

            // 失败，php 返回的 data 的值是一个二维的关联数组，被映射为 java 的一个数组；
//            Api api = JSON.parseObject(responseData, new TypeReference<Api<Student[]>>(){});
//            Log.d("haha errcode", api.getErrcode() + "");
//            Log.d("haha message", api.getMessage());
//            Student[] students = (Student[]) api.getData();
//            Log.d("haha id", students[0].getId() + "");
//            Log.d("haha name", students[0].getName());
//            Log.d("haha id", students[1].getId() + "");
//            Log.d("haha name", students[1].getName());

            // 成功，php 返回的 data 的值是一个二维的关联数组，被映射为 java 的一个 List；
//            Api api = JSON.parseObject(responseData, new TypeReference<Api<List<Student>>>(){});
//            Log.d("haha errcode", api.getErrcode() + "");
//            Log.d("haha message", api.getMessage());
//            List<Student> studentList = (List<Student>) api.getData();
//            Log.d("haha id", studentList.get(0).getId() + "");
//            Log.d("haha name", studentList.get(0).getName());
//            Log.d("haha id", studentList.get(1).getId() + "");
//            Log.d("haha name", studentList.get(1).getName());

            // 成功，php 返回的 data 的值是一个二维的关联数组，因为 key 是一个字符串，不是数字，被映射为 java 的一个 Map；
//            Api api = JSON.parseObject(responseData, new TypeReference<Api<Map<String, List<Student>>>>(){});
//            Log.d("haha errcode", api.getErrcode() + "");
//            Log.d("haha message", api.getMessage());
//            Map<String, List<Student>> studentMap = (Map<String, List<Student>>) api.getData();
//            Log.d("haha key", String.valueOf(studentMap.containsKey("list")));
//            List<Student> studentList = studentMap.get("list");
//            Log.d("haha id", studentList.get(0).getId() + "");
//            Log.d("haha name", studentList.get(0).getName());
//            Log.d("haha id", studentList.get(1).getId() + "");
//            Log.d("haha name", studentList.get(1).getName());
//            Log.d("haha id", studentList.get(2).getId() + "");
//            Log.d("haha name", studentList.get(2).getName());
            // 而且，测试了这样一个情况：接口不返回 data 字段，java 这边也没问题，getErrcode 和 getMessage 都正常执行。当然 getData 和下面的都要注释掉了 -- 这些应该放在判断内执行。


            // 上面的操作，都需要一个实际存在的类来解析；
            // 不想创建这样的类呢？
            JSONObject obj = JSON.parseObject(responseData);
            Log.d("haha errcode", obj.getInteger("errcode") + "");
            Log.d("haha errcode", obj.getString("message"));
            // 这就要逐个获取了，有点啰嗦。
            JSONObject obj2 = obj.getJSONObject("data");
            JSONArray array = obj2.getJSONArray("list");
            JSONObject x1 = (JSONObject) array.get(0);
            Log.d("haha id", x1.getInteger("id") + "");
            Log.d("haha name", x1.getString("name"));
            JSONObject x2 = (JSONObject) array.get(1);
            Log.d("haha id", x2.getInteger("id") + "");
            Log.d("haha name", x2.getString("name"));
            JSONObject x3 = (JSONObject) array.get(2);
            Log.d("haha id", x3.getInteger("id") + "");
            Log.d("haha name", x3.getString("name"));
        } catch (IOException e) {
            e.printStackTrace();
            Log.d("haha box", "onResponse 2");
        }
    }
}
